#ifndef _NF_MODULE_H
#define _NF_MODULE_H
#include "stdint.h"
#include "malloc.h"

//射频数据率
#define RF_DR_1Mbps      0b00
#define RF_DR_2Mbps      0b01
#define RF_DR_250Kbps    0b100

//射频发射功率
#define RF_PWR_7dBm      0b111
#define RF_PWR_4dBm      0b110
#define RF_PWR_3dBm      0b101
#define RF_PWR_1dBm      0b100
#define RF_PWR_0dBm      0b011
#define RF_PWR_N4dBm     0b010
#define RF_PWR_N6dBm     0b001
#define RF_PWR_N12dBm    0b000

typedef struct _nf_t nf_t;
typedef uint8_t  (*nf_msg_cb)(nf_t *nf, uint8_t msg, uint8_t arg_int, void *arg_ptr,void *res_arg_ptr);
typedef void     (*nf_set_call)(nf_t *nf);
typedef uint8_t  (*nf_transfer_call)(nf_t *nf,void *arg_ptr,uint8_t arg_int);    


struct _rx_add_t
{
    uint8_t add_width;         //数据通道有效宽度
    uint8_t rx_addr_p0[5];      //接收通道0地址
    uint8_t rx_addr_p1[5];      //接收通道1地址
    uint8_t rx_addr_p2;         //接收通道2的最低地址
    uint8_t rx_addr_p3;         //接收通道3的最低地址
    uint8_t rx_addr_p4;         //接收通道4的最低地址
    uint8_t rx_addr_p5;         //接收通道5的最低地址
};
typedef struct _rx_add_t rx_add_t;
/**********************
 * 功能：CRC 配置
 * *******************/
struct _crc_config_t
{
    uint8_t en_crc;             //使能CRC
    uint8_t crco;               //CRC长度
};
typedef struct _crc_config_t crc_config_t;
/***************************
 * 接收通道结构体
 * ************************/
struct _rx_channel
{
    uint8_t ENAA;              //使能数据管道自动确认
    uint8_t EN_Rxddr;          //使能数据管道
    uint8_t EN_DPL;            //使能动态负载长度
    uint8_t Data_witdh;        //通道数据宽度
};
typedef struct _rx_channel rx_channel_t;
/******************
 * 发送配置结构体
 * ***************/
struct _nf_tx_config
{
	uint8_t address_witdh;      //地址宽度
    uint8_t tx_add[5];          //发送地址
    uint8_t retr_ard;           //自动重发延时配置
    uint8_t retr_arc;           //最大自动重发次数
};
typedef struct _nf_tx_config nf_tx_config_t;
/***********************
 * 接收通道配置结构体
***********************/
struct _nf_rx_config
{
    rx_add_t          rx_add;
    rx_channel_t      p0;
    rx_channel_t      p1;
    rx_channel_t      p2;
    rx_channel_t      p3;
    rx_channel_t      p4;
    rx_channel_t      p5;
};
typedef  struct _nf_rx_config nf_rx_config_t;

/******************************
 *配置结构体 
*******************************/
struct _nf_config
{
    uint8_t             rf_ch;               //射频信道
    uint8_t             rf_dr;               //设置设备速率
    uint8_t             rf_pwr;              //设置发射功率
    nf_tx_config_t      tx_config;           //发送配置
    nf_rx_config_t      rx_config;
	crc_config_t        crc_config;          //CRC配置
};
typedef struct _nf_config nf_config_t;
/**************************
* 设备模块状态
**************************/
struct _nf_status
{
	uint8_t RX_FIFO_IsData;      
	uint8_t TX_Complete;
	uint8_t Max_retry;
	uint8_t RX_P_NO;
	uint8_t TX_FIFO_Full;
    uint8_t PRIM_RX;             //发射/接收配置
    uint8_t pwr_up;              //关断开机模式配置
	uint8_t irq;
};
typedef  struct _nf_status   nf_status;
/**************************
 * 底层驱动函数
 * ***********************/
struct _nf_dev_drive
{
	nf_set_call			set_Shutdown_model;//设置关断模式
    nf_set_call			set_tx_model;   //设置发送模式
    nf_set_call			set_rx_model;   //设置接收模式
    nf_transfer_call   tx_Packet;      //发送数据包
    nf_transfer_call   rx_Packet;      //接收数据包
	  nf_set_call        irq;            //中断函数
};
typedef  struct _nf_dev_drive   nf_dev_drive;
/*************************
 * 模块结构体
 * **********************/
struct _nf_t
{
    uint8_t           adress_width;        //模块发送/接收地址宽度，字节单位
    nf_config_t       nf_config;        //模块配置参数
	nf_status         status;
    nf_msg_cb         byte_cb;          //
    nf_msg_cb         gpio_and_delay_cb;
    nf_dev_drive      drive;         
};

#define NF_MSG_BYTE_SEND                   0x02   //传输数据
#define NF_MSG_BYTE_START_TRANSFER         0x01   //传输开始
#define NF_MSG_BYTE_END_TRANSFER           0x03   //结束数据传输
#define NF_MSG_BYTE_INIT                   0x04   //初始化

#define NF_MSG_GPIO_AND_DELAY_INIT         0x05   //延时函数初始化
#define NF_MSG_DELAY_MILLI                 0x06    //延时1ms
#define NF_MSG_GPIO_CS                     0x07    //CS 引脚
#define NF_MSG_GPIO_CE                     0x08    //CE引脚            
#define NF_MSG_BYTE_Transmit               0x09    //传输数据
#define NF_MSG_BYTE_Receive                0x0A    //接收数据

#define NF_MSG_IRQ_MODEL                   0x0B    //切换数据线为IRQ模式   
#define NF_MSG_DATA_MODEL                  0x0C    //切换为数据模式


void nf_Setup_Si24R1_noname_f(nf_t *nf,nf_msg_cb byte_cb,nf_msg_cb gpio_and_delay);  
void nf_Setup_Ci24R1_noname_f(nf_t *nf,nf_msg_cb byte_cb,nf_msg_cb gpio_and_delay);   //CI24R1
void NF_Set_Shutdown_Model(nf_t *nf,nf_config_t nf_config);
void NF_Set_TX_Model(nf_t *nf,nf_config_t nf_config);    //发送模式设置
void NF_Set_RX_Model(nf_t *nf,nf_config_t nf_config);    //接收模式设置
void NF_Send_Data(nf_t *nf,void *txbuf,uint8_t len);     //发送数据包
uint8_t NF_RX_Data(nf_t *nf,void *rxbuf,uint8_t len);    //接收数据
void NF_IRQ(nf_t *nf);                                   //中断处理函数
uint8_t ReadRSSI(nf_t *nf);
#endif
